﻿using PersistLayer.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PersistLayer.DAL
{
    public class ProdutoDAL
    {
        private Entities Entity;

        public ProdutoDAL()
        {
            Entity = new Entities();
        }

        public Produto Obter(Int64 pID)
        {
            return Entity.Produto.Where(a => a.ID == pID).SingleOrDefault();
        }
        public List<Produto> Listar()
        {
            return Entity.Produto.ToList();
        }
        public List<Produto> ListarMaisVendidos(int take)
        {
            var prodVendidos = Entity.Produto_Venda.GroupBy(a => a.Produto_ID).Select(b => b.FirstOrDefault());

            List<Produto> lstProdutos = new List<Produto>();
            Dictionary<Produto, int> dicProdQuant = new Dictionary<Produto, int>();

            foreach (var venda in prodVendidos)
            {
                int q = 0;
                Entity.Produto_Venda.Where(a => a.Produto_ID == venda.Produto_ID).ToList().ForEach(a => q += a.Quantidade);

                dicProdQuant.Add(Entity.Produto.Where(a => a.ID == venda.Produto_ID).Single(), q);
            }

            dicProdQuant = dicProdQuant.OrderBy(a => a.Value).ToDictionary(a => a.Key, b => b.Value);

            foreach (var item in dicProdQuant)
                lstProdutos.Add(item.Key);

            if (lstProdutos.Count > take)
                return lstProdutos.Take(take).ToList();

            return lstProdutos;
        }
        public List<Produto> ListarNovidades(int take)
        {
            try
            {
                return Entity.Produto.OrderByDescending(a => a.Data_Inclusao).Take(take).ToList();
            }
            catch (Exception)
            {
                throw;
            }
        }
        public List<Produto> ListarPromocoes(int take)
        {
            return Entity.Produto.Where(a => a.Promocao_ID != null).ToList();
        }
        public List<Produto> ListarPorLoja(int lID, int take, int skip)
        {
            try
            {
                return Entity.Produto.Where(a => a.Loja_ID == lID).ToList().Skip(skip).Take(take).ToList();
            }
            catch (Exception)
            {
                throw;
            }
        }
    }
}